#ifndef __STACKADT_H__
#define __STACKADT_H__

#include <stdbool.h>

// 本质上就是一个单链表
typedef int ElementType;
typedef struct seqstack
{
    ElementType *data; // 这里的data是一个整体,不是单个节点
    int stackSize;
    int currentSize;
} SeqStack;

/**
 * @brief 开辟一块空间并初始化栈
 *
 * @param stack 传入栈指针
 * @param size 传入初始化的栈大小
 */
void InitializeStack(SeqStack *pstack, int size);

/**
 * @brief 返回栈是否为空
 * 
 * @param stack 传入栈指针
 * @return true 空
 * @return false 非空
 */
bool StackIsEmpty(SeqStack *pstack);

/**
 * @brief 返回栈是否为满
 *
 * @param pstack 传入栈指针
 * @return true 栈满
 * @return false 栈不是满
 */
bool StackIsFull(SeqStack *pstack);

/**
 * @brief 返回栈已经使用多少
 * 
 * @param pstack 传入栈指针
 * @return int 栈使用的多少
 */
int StackItemCount(SeqStack *pstack);

/**
 * @brief 对栈进行压栈操作 Push
 *
 * @param pstack 传入栈指针
 * @param elem returns ElementType of data
 * @return true 成功
 * @return false 失败
 */
bool PushStack(SeqStack *pstack, ElementType *elem);

/**
 * @brief 对栈进行弹栈操作 Pop
 *
 * @param pstack 传入栈指针
 * @param elem returns ElementType of data
 * @return true 成功
 * @return false 失败
 */
bool PopStack(SeqStack *pstack, ElementType *elem);


/**
 * @brief Get the Top Of Stack object
 * 
 * @param pstack 
 * @param elem 
 * @return ElementType* 
 */
ElementType* GetTopOfStack(SeqStack *pstack);

/**
 * @brief 列出栈中的所有元素
 * 
 * @param pstack 
 * @return true 
 * @return false 
 */
bool ListStack(SeqStack *pstack);

/**
 * @brief 清空栈的所有元素,但不会释放空间
 *
 * @param pstack 传入栈指针
 * @return true 成功
 * @return false 失败
 */
bool EmptyStack(SeqStack *pstack);

#endif // __STACKADT_H__